
/**
 * Représente une Notification affichée
 * Se construit grâce à un objet NotificationCS reçut de l'extension
 */
var NotificationCS = function(notification) {
	
	var $this = this;
	
	
	this.status = "unloaded";
	this.html = "";
	this.name = "";
	this.params = {};
	this.id = 0;
	
	this.domelement = null;
	
	var Tools = NotificationCS.tools;
	
	/**
	 * Constructeur
	 */
	function __construct(notification) {
		for (var i in notification) {
			$this[i] = notification[i];
		}
		
		createDomElement();
		initEvent();
		$this.refreshParams();
	}
		
	/**
	 * Crée l'élément du DOM avec les données reçues
	 */
	function createDomElement() {
		var div = document.createElement("div");
		div.innerHTML = $this.html;
		div.setAttribute("id", "notificationcs-id-"+$this.id);
		Tools.css(div, "margin-bottom", "5px");
		$this.domelement = div;
	}
	
	/**
	 * Initialise les évèenemtns de la notification (close, submit)
	 */
	function initEvent() {
		var iconClose = Tools.findElements($this.domelement, ".freebox-link-extension-chrome.chrome-popup .close");
		Tools.on("click", iconClose, onclose);
		
		var forms = Tools.findElements($this.domelement, "form");
		Tools.on("submit", forms, onsubmit);
	}
	
	/**
	 * Lorsqu'on appuie sur la croix
	 */
	function onclose() {
		sendMessage({id: $this.id, action: 'close'});
	}
	
	/**
	 * Lorsqu'on fait un submit de formulaire
	 */
	function onsubmit(e) {
		var o = Tools.serialize(this, true);
		sendMessage({id: $this.id, action: 'submit', form: o});
		e.preventDefault();
		return false;
	}	
	
	/**
	 * Envoie d'un message à l'extension
	 */
	function sendMessage(msg) {
		var n = {};
		for (var i in notification) {
			if (i == "domelement" || typeof(notification[i]) == "function") {
				continue;
			}
			n[i] = notification[i];
		}
		msg.notification = n;
		NotificationCS.sendMessage(msg);
	}
	
	/**
	 * Rafraichit la notification avec les nouveaux paramètres
	 */
	this.refreshParams = function() {
		for (var cssrule in $this.params) {
			var elements = Tools.findElements($this.domelement, cssrule);
			var innerHTML = $this.params[cssrule];
			for (var i = 0; i < elements.length; i++) {
				elements[i].innerHTML = innerHTML;
			}
		}
	}

	__construct(notification);
};

NotificationCS.extension = null;
NotificationCS.container = null;
NotificationCS.disabled = false;
NotificationCS.tools = {};

NotificationCS.notifications = [];
NotificationCS.methods = [];

/**
 * Obtient les outils disponible au démarrage
 */
NotificationCS.getInitTools = function() {
	var t = null;
	if (typeof(ToolsPrototypeJS) != "undefined") {
		t = ToolsPrototypeJS;
	}
	else if (typeof(ToolsJQuery) != "undefined") {
		t = ToolsJQuery;
	}
	else if (typeof(ToolsCustom) != "undefined") {
		t = ToolsCustom;
	}
	return t;
}

/**
 * Initialisation
 * Création du conteneur des notifications
 */
NotificationCS.init = function() {

	var Tools = NotificationCS.getInitTools();
	if (!Tools) {
		console.error("[NotificationCS] Une implémentation de [Tools] doit exister (ToolsPrototypeJS, ToolsJQuery, ToolsCustom)");
		return;
	}
	NotificationCS.tools = Tools;
	
	NotificationCS.extension = chrome.runtime.connect({name: "NotificationCS"});
	NotificationCS.extension.postMessage({action: 'get-list-notifications'});
	NotificationCS.extension.onMessage.addListener(NotificationCS.onMessage);
	NotificationCS.extension.onDisconnect.addListener(NotificationCS.onDisconnect);
	
	
	
	
	var ctn = document.createElement("div");
	ctn.className = "freebox-link-extension-chrome notification";
	NotificationCS.container = ctn;
	
	var body = Tools.$first("body");
	if (!body) {
		NotificationCS.disabled = true;
	}
	else {
		body.appendChild(ctn);
	}
}

/**
 * Envoie un message à l'extension
 */
NotificationCS.sendMessage = function(msg) {
	NotificationCS.extension.postMessage(msg);
}
/**
 * Evènement à la déconnexion de l'extension, on enlève les notifications présentes
 */
NotificationCS.onDisconnect = function() {
	if (!NotificationCS.disabled) {
		var Tools = ToolsPrototypeJS;
		var body = Tools.$first("body");
		body.removeChild(NotificationCS.container);
	}
}

/**
 * Obtient une notification par son id
 */
NotificationCS.getNotification = function(id) {
	var notif = null;
	for (var i = 0; i < NotificationCS.notifications.length; i++) {
		var n = NotificationCS.notifications[i];
		if (n.id == id) {
			notif = n;
			break;
		}
	}
	return notif;
}


/**
 * Réception d'un message de l'extension
 */
NotificationCS.onMessage = function(msg) {
	if (NotificationCS.disabled) {
		return;
	}
	switch(msg.action) {
		
		case 'get-list-notifications': // Les notifications en cours
			var notifications = msg.notifications;
			for (var i = 0; i < notifications.length; i++) {
				var n = notifications[i];
				var notification = new NotificationCS(n);
				NotificationCS.container.appendChild(notification.domelement);
				NotificationCS.notifications.push(notification);
			}
			break;
		
		case 'show': // Affichage d'une notification
			var notif = msg.notification;
			var notification = new NotificationCS(notif);
			NotificationCS.container.appendChild(notification.domelement);
			NotificationCS.notifications.push(notification);
			break;
		
		case 'set-params':
			var notif = msg.notification;
			var notification = NotificationCS.getNotification(notif.id);
			notification.params = notif.params;
			notification.refreshParams();
			break;
		
		case 'close': // Fermeture d'une notification
			var notif = msg.notification;
			var id = notif.id;
			var notification = NotificationCS.getNotification(id);
			NotificationCS.container.removeChild(notification.domelement);
			break;
			
		case 'call': // méthode personnalisé
			var notif = msg.notification;
			var methodName = msg.method;
			var args = msg.args;
			var notification = NotificationCS.getNotification(notif.id);
			
			for (var i = 0; i < NotificationCS.methods.length; i++) {
				var method_info = NotificationCS.methods[i];
				if (method_info.methodName == methodName) {
					var call = true;
					if (method_info.options.name != undefined && method_info.options.name != notif.name) {
						call = false;
					}
					if (method_info.options.file != undefined && method_info.options.file != notif.file) {
						call = false;
					}
					
					if (call && typeof(method_info.method) == "function") {
						method_info.method.apply(notification, args);
					}
				}
			}
			
			break;
			
		default:
			console.log(msg);
	}
}

/**
 * Ajoute une méthode personnalisée
 */
NotificationCS.bind = function(methodName, f, opts) {
	if (typeof(opts) == "undefined") {
		opts = {};
	}
	NotificationCS.methods.push({methodName: methodName, method: f, options: opts});
}

NotificationCS.init();

